package com.jycode.commons.genericdao;

import java.io.Serializable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.hibernate.SQLQuery;

public interface GenericDAO2<T, ID extends Serializable> {
	T findById(ID id, boolean lock);

    List<T> findAll();

    List<T> findByExample(T exampleInstance);

    List<T> findByNamedQuery(String queryName, Object... queryArgs);
    List<T> findByNamedQuery(String queryName, Map<String, Object> queryArgs);
    List<T> findByNamedQuery(String queryName, final int from, final int max, Object... queryArgs);
    List<T> findByNamedQuery(String queryName, final int from, final int max, Map<String, Object> queryArgs);

    Iterator<T> iterateByNamedQuery(String queryName, Object... queryArgs);
    Iterator<T> iterateByNamedQuery(String queryName, Map<String, Object> queryArgs);
    Iterator<T> iterateByNamedQuery(String queryName, final int from, final int max, Object... queryArgs);
    Iterator<T> iterateByNamedQuery(String queryName, final int from, final int max, Map<String, Object> queryArgs);

    SQLQuery createNativeQuery(String queryStringSql);

    Object executeQuery(String queryStringHql);
    Object executeNativeQuery(String queryStringSql);
    T executeNativeQueryToEntity(String queryStringSql);

    int executeUpdate(String queryStringHql);
    int executeNativeUpdate(String queryStringSql);

    T makePersistent(T entity);

    void makeTransient(T entity);

    ID create(T newInstance);
    void delete(T persistentObject);
    /**
     * 读取给定主键的记录到实体类, 如果主键不存在,返回null
     * @param id
     * @return
     */
    T read(ID id);
    /**
     * 按照给出的主键读取记录到实体类,如果主键不存在,则构造一个待持久化的内存版本的实体类实例并返回.
     * @param id
     * @return
     */
    T loadWithLock(ID id);
    T loadWithoutLock(ID id);
    void update(T transientObject);

    /**
     * 从list中返回一个单一的元素. 总是返回list中的第一个元素. 如果list为空,则返回null.
     * @param list
     * @return
     */
    T uniqueResult(List<T> list);
}
